<?php declare(strict_types=1);

namespace Zyucv7\Core\Config;

/**
 * 配置管理类
 */
class Config
{
    /** @var array 配置缓存 */
    private static $configs = [];

    /**
     * 加载配置文件
     * @param string $name 配置文件名（不含扩展名）
     * @param string $path 配置文件路径
     */
    public static function load(string $path): void
    {
        if (!file_exists($path)) {
            throw new \InvalidArgumentException('Config Exceptiion: Can not find load file。'.V7_EOL.'File Path：'.$path);
        }
        $config_data = require $path;

        self::$configs = array_merge(self::$configs, $config_data);
    }

    /**
     * 获取配置值
     * @param string $key 配置键名（支持点语法）
     * @param mixed $default 默认值
     * @return mixed
     */
    public static function get(string $key)
    {
        $segments = explode('.', $key);
        $name = array_shift($segments);

        // 如果配置未加载，尝试自动加载
        if (!isset(self::$configs[$name])) {
            return null;
        }

        $value = self::$configs[$name];

        foreach ($segments as $segment) {
            if (!is_array($value) || !isset($value[$segment])) {
                return null;
            }
            $value = $value[$segment];
        }

        return $value;
    }

    /**
     * 设置配置值
     * @param string $key 配置键名（支持点语法）
     * @param mixed $value 配置值
     */
    public static function set(string $key, $value): void
    {
        $segments = explode('.', $key);
        $name = array_shift($segments);

        if (!isset(self::$configs[$name])) {
            self::$configs[$name] = [];
        }

        $pointer = &self::$configs[$name];

        foreach ($segments as $segment) {
            if (!isset($pointer[$segment]) || !is_array($pointer[$segment])) {
                $pointer[$segment] = [];
            }
            $pointer = &$pointer[$segment];
        }

        $pointer = $value;
    }
}